Задача: Реализация структурированного JSON-логирования для интеграции с ClickHouse (Vector / Fluentbit) Описание задачи: Для обеспечения сквозного мониторинга (Observability) работы сервиса Gov Registry Gateway, анализа качества интеграции и автоматического сбора аналитики в ClickHouse, необходимо перевести стандартный вывод логов (stdout) на структурированный формат JSON. Логи будут подхватываться агентом сбора логов (Vector/Fluentbit) прямо из контейнера, поэтому в коде не должно быть никакой текстовой примеси. ⚙️ Технические требования: 1. Формат вывода: Строго одна валидная JSON-строка (JSON Lines) на одно событие в os.Stdout. 2. Библиотека: Использовать любой производительный структурированный логгер на выбор (uber-go/zap или стандартный slog из Go 1.21+). 3. Обязательные поля в корне JSON-лога: • timestamp (string) — Время события в формате RFC3339 Nano. • level (string) — Уровень логирования (INFO, WARN, ERROR, FATAL, CRITICAL). • canonical_code (string) — Внутренний код ошибки из справочника обсервабилити (например, GOV_AUTH_DENIED, DB_GOV_POSTGRES_DOWN). Если запрос успешный — заполнять значением SUCCESS. • transport_statuses (object) — Объект со статусами протоколов: {“grpc”: int, “http”: int}. Если статус для gRPC отсутствует — ставить null. • error_target (string) — Направление ошибки: EXTERNAL_SYSTEM (ушло клиенту) или INTERNAL_SYSTEM (сбой внутри инфраструктуры). • ui_payload (object/null) — Для данного B2B-сервиса всегда передавать null. • observability_json (object) — Метрики для ClickHouse. Должен содержать поля metric (строка) и labels (объект с контекстом: имя сервиса, причина, имя БД).

Примеры логов, которые должен генерировать сервис в stdout:
  1. Пример при ошибке авторизации токена (GOV_AUTH_DENIED):

{ “timestamp”: “2026-09-27T07:51:00.123456Z”, “level”: “WARN”, “canonical_code”: “GOV_AUTH_DENIED”, “transport_statuses”: { “grpc”: 16, “http”: 401 }, “error_target”: “EXTERNAL_SYSTEM”, “ui_payload”: null, “observability_json”: { “metric”: “auth_fail”, “labels”: { “service”: “gov_gateway”, “reason”: “token_invalid_or_revoked” } } }

{ “timestamp”: “2026-09-27T07:51:05.987654Z”, “level”: “FATAL”, “canonical_code”: “DB_GOV_POSTGRES_DOWN”, “transport_statuses”: { “grpc”: 14, “http”: 500 }, “error_target”: “INTERNAL_SYSTEM”, “ui_payload”: null, “observability_json”: { “code”: “DB_GOV_POSTGRES_DOWN”, “metric”: “db_conn_lost”, “labels”: { “db”: “gov_registry_db” } } }